package config;

import java.sql.SQLException;

import org.apache.catalina.Context;
import org.apache.tomcat.util.scan.StandardJarScanner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = "handler")
public class SpringBootConfig {
    /*
     * tomcat作为web服务器除了负责加载依赖包之外，还可以运用jar扫描器，
     * 对依赖的包的元信息中的Manifest进行扫描
     * 如果Manifest的Class-Path属性中包含某些依赖包的文件名，就会尝试加载这些文件名对应的包
     * 但有些时候，我们已经引入这些依赖包，只是这些依赖包在maven本地仓库中的文件名包含版本号
     * jar扫描器在扫描不到匹配文件名的包时，就会抛出调用目标异常（InvocationTargetException）
     * 和无此类文件异常（NoSuchFileException）
     * 在这种情况下，我们必须对JarScanner进行配置，令其不扫描Manifest
     */
    @Bean
    public TomcatServletWebServerFactory tomcatFactory() {
        return new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                ((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
            }
        };
    }
    
    public static void main(String[] args) throws SQLException {
        SpringApplication app = new SpringApplication(SpringBootConfig.class);
        app.run(args);
    }
}
